Оператор [save]
Общий принцип
Обработка правил — это итеративный процесс. На каждой итерации выполняется полный проход по всему набору правил — строго с первого узла до последнего.
На каждой новой итерации все логические узлы правила вычисляются заново. Это обеспечивает сбор и обработку актуальных данных в каждый отдельный момент времени.
Назначение оператора
Оператор [save] необходим, когда требуется сохранить вычисленное значение узла и использовать его на следующей итерации. Без этого оператора значения узлов будут обнулены перед началом нового цикла обработки.
Пример правила
Это отвлечённый пример правила, состоящего из двух узлов. Особенность: первый узел (N1_do_ping_if_possible) использует значение второго узла (N2_pinghost), вычисленное на предыдущей итерации. Чтобы на новой итерации значение второго узла не обнулилось, применяется оператор ["save"].
Последовательность обработки
- На каждой итерации узлы обрабатываются последовательно: от первого до последнего.
- Перед каждой итерацией значения узлов обнуляются (если не использован
save).
Код правила
--------------------------------
-- Узел "N1_do_ping_if_possible"
--------------------------------
-- Осуществляет пинг сети только в том случае, если IP-адрес хоста равен 8.8.8.8
-- В противном случае оператор ["skip"] пропускает выполнение следующего за ним оператора ["load-ubus"],
-- избегая тем самым неправильного ping-запроса к хосту.
N1_do_ping_if_possible = {
{
["skip"] = function(nodes)
local host_undefined = (nodes.N2_pinghost ~= "8.8.8.8")
if (host_undefined) then return true else return false end
end
},
{
["load-ubus"] = function(nodes)
return {
ubus = "tsmping",
method = "send",
params = {
pinghost = nodes.N2_pinghost,
},
}
end
},
},
---------------------
-- Узел "N2_pinghost"
---------------------
-- Путём запуска оператора ["load-ubus"] получает из конфигурации прибора IP-адрес хоста для пинга.
-- Затем оператор ["save"] сохраняет полученное значение для использования на следующей итерации обработки правила.
N2_pinghost = {
{
["load-ubus"] = function(nodes)
return {
ubus = "uci",
method = "get",
params = {
config = "tsmodem",
section = "default",
option = "ping_host"
},
}
end
},
{
["save"] = function(nodes)
return nodes.N2_pinghost -- Оператор ["save"] сохраняет значение узла "N2_pinghost"
end -- для использования на следующей итерации.
}
},